PostgreSQL 安全管理 数据脱敏 Anonymizer 静态脱敏 (Static Masking)
1 背景知识
静态脱敏是一种将敏感数据在数据库中永久性替换或修改的过程。一旦应用了静态脱敏,原始数据就会被覆盖,无法恢复。
本章将会使用 Anonymizer 插件进行静态脱敏。
1.1 静态脱敏的优点
-
数据安全性提高:由于敏感数据已被永久替换,即使数据泄露,也不会暴露原始信息。
-
符合合规性要求:对于需要永久删除或替换特定信息以满足法规要求的场景非常有用。
-
适合非生产环境:在测试或开发环境中使用静态掩码可以确保使用的是去敏感化的数据,减少泄露风险。
1.2 静态脱敏的缺点
-
不可逆:一旦应用,原始数据就无法恢复,这可能导致某些用例中的数据不再有用。
-
性能开销:根据数据库的大小,静态掩码可能需要显著的处理时间和资源。
-
数据价值降低:对于需要保持数据统计特性或分析价值的场合,静态掩码可能不是最佳选择。
1.3 静态掩码的方法
可以通过以下三种方法实现静态脱敏:
- 屏蔽规则方式(Applying masking rules)。
- 随机排列方式(Shuffling a column)。
- 噪音干扰方式(Adding noise to a column)。
2 屏蔽规则方式
使用 脱敏规则 中的 anon.anonymize_database()
函数来实现屏蔽规则。
2.1 环境准备
CREATE TABLE customer(
id SERIAL,
full_name TEXT,
birth DATE,
employer TEXT,
zipcode TEXT,
fk_shop INTEGER
);
//屏幕输出:
CREATE TABLE
INSERT INTO customer
VALUES
(911,'Chuck Norris','1940-03-10','Texas Rangers', '75001',12),
(312,'David Hasselhoff','1952-07-17','Baywatch', '90001',423)
;
//屏幕输出:
INSERT 0 2
SELECT * FROM customer;
//屏幕输出:
id | full_name | birth | employer | zipcode | fk_shop
-----+------------------+------------+---------------+---------+---------
911 | Chuck Norris | 1940-03-10 | Texas Rangers | 75001 | 12
112 | David Hasselhoff | 1952-07-17 | Baywatch | 90001 | 423
2.2 加载插件
CREATE EXTENSION IF NOT EXISTS anon CASCADE;
SELECT anon.init();
//屏幕输出:
CREATE EXTENSION
init
------
t
(1 row)
2.3 声明脱敏规则
SECURITY LABEL FOR anon ON COLUMN customer.full_name
IS 'MASKED WITH FUNCTION anon.fake_first_name()';
SECURITY LABEL FOR anon ON COLUMN customer.employer
IS 'MASKED WITH FUNCTION anon.fake_company()';
SECURITY LABEL FOR anon ON COLUMN customer.zipcode
IS 'MASKED WITH FUNCTION anon.random_zip()';
2.4 对数据进行脱敏
SELECT anon.anonymize_database();
//屏幕输出:
anonymize_database
--------------------
t
(1 row)
SELECT * FROM customer;
//屏幕输出:
id | full_name | birth | employer | zipcode | fk_shop
-----+-----------+------------+-------------------------+---------+---------
911 | Chloe | 1940-03-10 | Matthews and Sons | 66737 | 12
312 | Ray | 1952-07-17 | Chang, Thomas and Davis | 40217 | 423
(2 rows)
2.5 多次脱敏
可以使用 anon.anonymize_table() 和 anon.anonymize_column() 函数多次将脱敏数据。
SELECT anon.anonymize_table('customer');
SELECT anon.anonymize_column('customer','zipcode');
静态脱敏是一个非常缓慢的过程。静态脱敏是将表中的某个列全部更新。这意味着会产生大量的磁盘IO 。根据数据大小,硬件配置或者实例优化情况,使用导出脱敏可能会更快。
3 随机排列方式
此方式会将一个列中的数值乱序排序。
anon.shuffle_column(shuffle_table, shuffle_column, primary_key) 函数将会重新排序字段中的所有值。
你需要提供表的主键。
shuffle_column() 函不是一个脱敏函数
4 噪音干扰方式
anon.add_noise_on_numeric_column(table, column, ratio) 如果 (ratio)=0.33
时,该列的所有数值将会按照 +/-33%
比例增加或者减少。
anon.add_noise_on_datetime_column(table, column, interval) 如果 interval='2 days'
,该列的数值将按照 +/-2
天的比例增加或者减少。
噪音函数容易受到重复计算的攻击,请见 PostgreSQL Anonymize noise_reduction_attack.sql 获取更多信息。也可以参考这篇文章